#!/usr/bin/env python3
"""
AI Agent 演示系统主入口

这是整个 AI Agent 系统的启动点，展示了如何：
1. 初始化 Agent 和各个组件
2. 配置环境和工具
3. 启动交互式对话界面
4. 处理用户输入和展示结果
"""

import os
import sys
import asyncio
import argparse
from pathlib import Path
from dotenv import load_dotenv

# 添加项目根目录到 Python 路径
sys.path.insert(0, str(Path(__file__).parent))

from agent.core import Agent, AgentConfig
from tools import ToolRegistry, CalculatorTool, SearchTool, FileSystemTool
from rich.console import Console
from rich.panel import Panel
from rich.prompt import Prompt


def setup_environment():
    """设置环境配置"""
    # 加载环境变量
    load_dotenv()
    
    # 检查必要的 API 密钥
    if not os.getenv("OPENAI_API_KEY"):
        console = Console()
        console.print(Panel(
            "⚠️  未检测到 OPENAI_API_KEY 环境变量\n\n"
            "请设置你的 OpenAI API 密钥:\n"
            "export OPENAI_API_KEY='your-api-key-here'\n\n"
            "或者在 .env 文件中添加:\n"
            "OPENAI_API_KEY=your-api-key-here\n\n"
            "💡 为了演示目的，系统将在没有 API 密钥的情况下运行（使用模拟响应）",
            title="配置提醒",
            border_style="yellow"
        ))


def create_demo_agent() -> Agent:
    """创建演示用的 Agent"""
    # 从环境变量读取配置
    provider = os.getenv("AGENT_PROVIDER", "openai")
    model = os.getenv("AGENT_MODEL", "gpt-4")
    ollama_base_url = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
    
    # 如果未设置 provider 但设置了 ollama 相关配置，自动切换到 ollama
    if provider == "openai" and not os.getenv("OPENAI_API_KEY") and os.getenv("OLLAMA_MODEL"):
        provider = "ollama"
        model = os.getenv("OLLAMA_MODEL", "qwen2.5:8b")
    
    # 创建 Agent 配置
    config = AgentConfig(
        name=os.getenv("AGENT_NAME", "DemoAgent"),
        provider=provider,
        model=model,
        temperature=float(os.getenv("AGENT_TEMPERATURE", "0.7")),
        max_tokens=int(os.getenv("AGENT_MAX_TOKENS", "2000")),
        enable_memory=True,
        enable_planning=True,
        verbose=True,
        ollama_base_url=ollama_base_url
    )
    
    # 创建 Agent 实例
    agent = Agent(config)
    
    # 工具已经自动注册，这里可以注册额外的自定义工具
    # agent.register_tool(CustomTool())
    
    return agent


async def interactive_mode(agent: Agent):
    """交互式对话模式"""
    console = Console()
    
    console.print(Panel(
        "🚀 **交互模式已启动**\n\n"
        "输入你的问题或请求，Agent 会分析并执行。\n"
        "输入 'quit', 'exit' 或 'q' 退出程序。",
        title="开始对话",
        border_style="green"
    ))
    
    while True:
        try:
            # 获取用户输入
            user_input = Prompt.ask("\n[bold cyan]你[/bold cyan]", console=console)
            
            # 检查退出命令
            if user_input.lower() in ['quit', 'exit', 'q', '退出', '结束']:
                console.print("\n[yellow]👋 再见！感谢使用 AI Agent 演示系统！[/yellow]")
                break
            
            if not user_input.strip():
                console.print("[red]请输入有效的问题或请求[/red]")
                continue
            
            # 处理用户输入
            response = await agent.process_input(user_input)
            
            # 显示 Agent 响应
            console.print(f"\n[bold green]🤖 {agent.config.name}:[/bold green]")
            console.print(Panel(response, border_style="blue"))
            
        except KeyboardInterrupt:
            console.print("\n[yellow]检测到 Ctrl+C，正在退出...[/yellow]")
            break
        except Exception as e:
            console.print(f"\n[red]发生错误: {str(e)}[/red]")


async def demo_mode(agent: Agent):
    """演示模式 - 展示预定义的示例"""
    console = Console()
    
    console.print(Panel(
        "🎯 **演示模式**\n\n"
        "将运行一系列预定义的示例来展示 Agent 的各种能力。",
        title="演示开始",
        border_style="magenta"
    ))
    
    # 预定义的演示示例
    demo_examples = [
        "计算 15 * 24 + 37",
        "搜索 Python 编程教程",
        "创建一个名为 demo.txt 的文件，内容是 'Hello, AI Agent!'",
        "帮我分析一下 AI Agent 的核心组件有哪些",
        "制定一个学习 Python 的计划"
    ]
    
    for i, example in enumerate(demo_examples, 1):
        console.print(f"\n[bold yellow]示例 {i}: {example}[/bold yellow]")
        
        # 模拟用户输入
        response = await agent.process_input(example)
        
        # 显示结果
        console.print(Panel(response, title=f"Agent 响应 - 示例 {i}", border_style="cyan"))
        
        # 等待用户按键继续
        if i < len(demo_examples):
            Prompt.ask("\n按 Enter 继续下一个示例", default="", show_default=False)
    
    console.print("\n[green]✅ 演示完成！[/green]")


def show_status(agent: Agent):
    """显示 Agent 状态信息"""
    console = Console()
    
    status = agent.get_status()
    
    status_text = f"""
## 📊 Agent 状态信息

**配置信息**:
- 名称: {status['config']['name']}
- 模型: {status['config']['model']}
- 温度: {status['config']['temperature']}
- 最大令牌: {status['config']['max_tokens']}

**运行状态**:
- 当前状态: {status['state']}
- 对话轮数: {status['conversation_length']}
- 可用工具: {len(status['available_tools'])} 个
- 记忆条目: {status['memory_entries']} 条

**可用工具**:
{chr(10).join([f"- {tool}" for tool in status['available_tools']])}
"""
    
    console.print(Panel(status_text, title="系统状态", border_style="blue"))


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="AI Agent 演示系统")
    parser.add_argument(
        "--mode", 
        choices=["interactive", "demo", "status"], 
        default="interactive",
        help="运行模式: interactive(交互), demo(演示), status(状态)"
    )
    parser.add_argument(
        "--no-banner", 
        action="store_true",
        help="不显示启动横幅"
    )
    
    args = parser.parse_args()
    
    # 设置环境
    setup_environment()
    
    console = Console()
    
    # 显示启动横幅
    if not args.no_banner:
        banner = """
 █████╗ ██╗     █████╗  ██████╗ ███████╗███╗   ██╗████████╗
██╔══██╗██║    ██╔══██╗██╔════╝ ██╔════╝████╗  ██║╚══██╔══╝
███████║██║    ███████║██║  ███╗█████╗  ██╔██╗ ██║   ██║   
██╔══██║██║    ██╔══██║██║   ██║██╔══╝  ██║╚██╗██║   ██║   
██║  ██║██║    ██║  ██║╚██████╔╝███████╗██║ ╚████║   ██║   
╚═╝  ╚═╝╚═╝    ╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝   

🤖 AI Agent 演示系统 - 探索智能代理的工作原理
        """
        console.print(banner, style="bold cyan")
    
    try:
        # 创建 Agent
        console.print("[yellow]正在初始化 Agent...[/yellow]")
        agent = create_demo_agent()
        console.print("[green]✅ Agent 初始化完成[/green]")
        
        # 根据模式运行
        if args.mode == "interactive":
            asyncio.run(interactive_mode(agent))
        elif args.mode == "demo":
            asyncio.run(demo_mode(agent))
        elif args.mode == "status":
            show_status(agent)
            
    except KeyboardInterrupt:
        console.print("\n[yellow]程序被用户中断[/yellow]")
    except Exception as e:
        console.print(f"\n[red]程序异常: {str(e)}[/red]")
        import traceback
        console.print(f"[red]{traceback.format_exc()}[/red]")


if __name__ == "__main__":
    main()